#ifndef BASE_SCOPE_EXIT_H
#define BASE_SCOPE_EXIT_H

#include <functional>
#include "defines.h"


//! 退出区域的时候执行的动作
class ScopeExitActionGuard {
    using ScopeExitFunc = std::function<void()>;
    ScopeExitFunc func_;

  public:
    ScopeExitActionGuard(const ScopeExitFunc &func) : func_(func) { }

    NONCOPYABLE(ScopeExitActionGuard);
    IMMOVEABLE(ScopeExitActionGuard);

    ~ScopeExitActionGuard() { if (func_) func_(); }

    void cancel() { func_ = nullptr; }
};


#define _ScopeExitActionName_1(line) ScopeExitActionGuard _scope_exit_action_guard_##line
#define _ScopeExitActionName_0(line) _ScopeExitActionName_1(line)

#define SetScopeExitAction(...) _ScopeExitActionName_0(__LINE__) (__VA_ARGS__)

#endif

